package Day_0224.NetWork;

/**
 * @author zxc
 * @date 2023/02/24 10:57
 **/
public class TCP_Unbuild {
    public static void main(String[] args) {
        /**
         * 谈一谈对于断开TCP连接---四次挥手的理解
         * ===>
         * 1.由于TCP连接是全双工的，因此，每个方向都必须要单独进行关闭，
         * （1）这一原则是,当一方完成数据发送任务后，发送一个FIN包,来终止这一方向的连接;
         * （2）收到一个FIN包，只是意味着这一方向上没有数据流动了，即不会再收到数据了;
         * （3）但是在这个TCP连接上，仍然能够发送数据，直到这一方向也发送了FIN。
         * 2.首先进行关闭的一方将执行主动关闭，而另一方则执行被动关闭，
         *
         * 3.TCP四次挥手的过程
         * 所谓的四次挥手：即,断开TCP连接，
         * 就是指断开一个TCP连接时，需要客户端和服务端总共发送4个包，以确认TCP连接的断开;
         * 1）第一次挥手
         * （1）client向server主动发送FIN包，用来关闭Client端到Server端的数据传输;
         * （2）Client端进入到FIN_WAIT_1状态;
         *
         * 2）第二次挥手
         * （1）Server端接收到Client发送的FIN包，发送ACK包（确认序号 = 收到序号 + 1）;
         * （2）Server端进入到CLOSE_WAIT状态;
         * ===》
         * 为啥Server端未发送FIN包？
         * 原因 ：可能Server端，还在发送数据给Client端,即，需要等到Server端向Client端数据传输完毕后，再去发送FIN包;
         *
         * 3）第三次挥手
         * 即，Server端向Client端所发送数据的过程完成之后
         * （1）Server端向Client端主动发送FIN包，用来关闭Server端到CClient端之间的数据传输;
         * （2）Server端进入到LAST_ACK状态;
         *
         * 4)第四次挥手
         * （1）Server接收到Server端所发送的FIN包后，发送ACK包给服务端（ACK包和FIN包，并不是传输数据，不需要通过TCP连接）
         * （2）Client端进入到TIME_WAIT状态;
         * ===》即，经过一段时间之后，Client端进入到Closed状态;
         * （3）Server端接收到来自Client端的ACK包后，则进入到Closed状态;
         *
         * 4.为什么要有TIME_WAIT状态？
         * TIME_WAIT状态存在有两个原因。
         * 1）可靠地终止TCP连接 ：
         * （1）如果最后一个ACK报文因为网络原因被丢弃，此时server因为没有收到ACK，而超时重传FIN报文，
         * （2）处于TIME_WAIT状态的client，可以继续对FIN报文做回复，向server发送ACK报文。
         * 2）保证让迟来的TCP报文段有足够的时间被识别和丢弃。
         * ===》
         * 连接结束了，网络中的延迟报文也应
         * 该被丢弃掉，以免影响立刻建立的新连接。
         *
         */
    }
}
